﻿using ConfExpert.Forms.Aksesuar.Satinalma;
using ConfExpert.Forms.Base;
using ConfExpert.Forms.Depo.Aksesuar;
using DevExpress.XtraBars;
using DevExpress.XtraEditors;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraReports.UI;
using DevTeam;
using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

namespace ConfExpert.Forms.Depo.Kauf
{
    public partial class AksesuarIhtiyaciCoklu : XForm
    {
        public AksesuarIhtiyaciCoklu()
        {
            InitializeComponent();
        }

        public AksesuarIhtiyaciCoklu(string kaufIdxs)
            : this()
        {
            Idxs = kaufIdxs;
        }

        public AksesuarIhtiyaciCoklu(DataTable dtOrders,string kaufIdxs, bool IsRequestable, int BrandId, int SezonId, string OrderRef, bool IsNumune, string SpName)
            : this(kaufIdxs)
        {
            this.IsRequestable = IsRequestable;
            this.BrandId = BrandId;
            this.SezonId = SezonId;
            this.SpName = SpName;
            this.OrderRef = OrderRef;
            this.IsNumune = IsNumune;
            this.dtOrders = dtOrders;
        }
        
        public DataTable distinctDosya { get; set; }
        private DataTable dtOrders { get; set; }
        public string OrderRef { get; set; }
        string Idxs, SpName;
        bool IsRequestable = true;
        bool IsNumune = false;
        int BrandId, SezonId;

        private void AksesuarIhtiyaci_Load(object sender, EventArgs e)
        {
            gvTreeLines.Init(SpName, Idxs, BrandId);
            
            if (IsNumune)
                gvTreeLines.AddColumn("EksikMiktar", typeof(int), "IIF(TalepEdilen-Isnull(AyrilanMiktar,0)+Isnull(CikilacakMiktar,0)-Isnull(QtyPO,0) > 0 and Isnull(OrtakMi,0) = 0, TalepEdilen-Isnull(AyrilanMiktar,0)+Isnull(CikilacakMiktar,0)-Isnull(QtyPO,0),0)");
            else
                gvTreeLines.AddColumn("EksikMiktar", typeof(int), "IIF(TalepEdilen-Isnull(AyrilanMiktar,0)+Isnull(CikilacakMiktar,0)-Isnull(QtyPO,0)+Isnull(ToplamCikilan2,0) > 0 , TalepEdilen-Isnull(AyrilanMiktar,0)+Isnull(CikilacakMiktar,0)-Isnull(QtyPO,0)+Isnull(ToplamCikilan2,0),0)");

            gvTreeLines.MakeReadOnly("TalepEdilen");
            gvTreeLines.YanYanaGetir("EksikMiktar:AyrilanMiktar");
            gvTreeLines.MakeColumnInvisible("OrtakMi", "ToplamCikilan2");
  
            gvTreeLines.FormatAsNumber(0, "TalepEdilen", "AyrilanMiktar", "IdleMiktar", "QtyPO", "ToplamStok", "EksikMiktar", "CikilacakMiktar", "BoyanacakMiktar", "ToplamCikilan"/*, "DigerMarkaStok", "ToplamCikilan", "MusteridenGelecek"*/);
            gvTreeLines.AddSummary("TalepEdilen", "AyrilanMiktar", "IdleMiktar", "QtyPO", "ToplamStok", "EksikMiktar", "CikilacakMiktar", "ToplamCikilan"/*, "DigerMarkaStok", "ToplamCikilan", "MusteridenGelecek"*/);
            
            foreach (DevExpress.XtraGrid.Columns.GridColumn gc in gvTreeLines.Columns)
            {
                gvTreeLines.SetCaptions(gc.FieldName + ":" + gc.FieldName.Replace("Miktar", ""));
            }
            
            gvTreeLines.Columns["TalepEdilen"].ToolTip = "Seçili satırların aksesuar ihtiyacını gösterir.";
            gvTreeLines.Columns["AyrilanMiktar"].ToolTip = "Seçilen satırlardaki OrderRef için ayrılan toplam aksesuar miktarını gösterir.";
            gvTreeLines.Columns["IdleMiktar"].ToolTip = "Aksesuarın, kendi müşterisine ayrılmış ama herhangi bir siparişe ayrılmamış miktarını gösterir.";
            gvTreeLines.Columns["QtyPO"].ToolTip = "İlgili OrderRef için satınalmaya geçilmiş olan talep miktarını gösterir.";
            gvTreeLines.Columns["CikilacakMiktar"].ToolTip = "İlgili OrderRef için önceden yapılmış çıkış emirlerindeki çıkılacak miktarı gösterir.";
            gvTreeLines.Columns["ToplamStok"].ToolTip = "Depodaki toplam stok miktarını gösterir.";
            gvTreeLines.Columns["ToplamCikilan"].ToolTip = "İlgili OrderRef için önceden çıkılmış olan miktarı gösterir.";

            gvTreeLines.Columns["Boyama"].VisibleIndex = 25;
            gvTreeLines.BestFitColumns();
            gvTreeLines.RowCellStyle += new RowCellStyleEventHandler(gvTreeLines_RowCellStyle);
            bbiAksPO.ItemClick += bbiAksPO_ItemClick;
            bbiTalepOlustur.ItemClick += bbiTalepOlustur_ItemClick;
            bbiRezerve.ItemClick += bbiRezerve_ItemClick;
            gvTreeLines.CellValueChanged += gvTreeLines_CellValueChanged;

            if (gvTreeLines.DataTable().Select("Isnull(Boyama,0)=1").Length > 0)
            {
                gleBoyama.Visibility = BarItemVisibility.Always;
                gleBoyama.Edit.Assign(RI(Rp.Cari));
            }

            bbiTalepOlustur.Enabled = IsRequestable;
            SetButtonsEnabled();
        }

        void gvTreeLines_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
        {
            gvTreeLines.EndEditing();
            if (e.RowHandle > -1)
                if (e.Column.FieldName == "TalepEdilen")
                    SetButtonsEnabled();
        }

        void bbiRezerve_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            DataTable dtAksesuar = gvTreeLines.DataTable();
            DataRow[] dr = dtAksesuar.Select("Isnull(IdleMiktar,0) > 0 and Isnull(EksikMiktar,0) > 0 and Isnull(OrtakMi,0) = 0");

            if (dr.Length > 0)
            {
                DataTable dt = dr.CopyToDataTable();
                dt.TableName = "Aksesuar";
                dt.Columns["TalepEdilen"].ColumnName = "ToplamIhtiyac";
                dt.Columns.Add("QtySelected", typeof(int), "IIF( IsNull(IdleMiktar, 0) < IsNull(EksikMiktar, 0), IsNull(IdleMiktar, 0), IsNull(EksikMiktar, 0))");

                string xmlSel = dt.Serialize(); //XML.SerializeAll(dt);

                using (AksesuarAyir transfer = new AksesuarAyir(xmlSel, BrandId, SezonId, OrderRef))
                    if (transfer.ShowDialog() == DialogResult.OK)
                        Yenile();
            }
        }

        string aksesuarCikisTalebiId;
        void bbiTalepOlustur_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            /*
            int EksikRowCount = gvTreeLines.DataTable().Select("Isnull(EksikMiktar,0) > 0").Length;
            if (EksikRowCount > 0)
                if (XtraMessageBox.Show("TALEP EDİLEN miktar, EKSİK MİKTAR kadar eksiltilecek. Devam etmek istiyor musunuz ?", "Critical", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No)
                    return;
                else
                    foreach (DataRow dr in gvTreeLines.DataTable().Select("Isnull(EksikMiktar,0) > 0"))
                    {
                        dr["TalepEdilen"] = dr["TalepEdilen"].ToInt() - dr["EksikMiktar"].ToInt();
                    }
             */
            if (gvTreeLines.DataTable().Select("Isnull(Boyama,0)=1").Length > 0 && gleBoyama.EditValue.ToInt() == 0)
            {
                ShowErrorMessage("Boyama yeri girin !");
                return;
            }
            distinctDosya = dtOrders.DefaultView.ToTable(true, "DosyaNo");
            distinctDosya.Columns.Add("AksesuarCikisTalebiId", typeof(string));

            foreach (DataRow drDosya in distinctDosya.Rows)
            {
                string DosyaNo = drDosya["DosyaNo"].ToStr();
                string DosyaIdx = dtOrders.Select("Isnull(DosyaNo,'') = '" + DosyaNo + "'").CopyToDataTable().GetValuesofSpecifiedColumn("idx", ",");

                DataSet dsIhtiyac = ExecuteDataSet("createAksesuarTalepforOrders", DosyaIdx, BrandId);

                DataTable dtAksesuar = dsIhtiyac.Tables["Table"];

                DataRow[] DtBoyama = dtAksesuar.Select("Isnull(Boyama,0)=1"); //TODO K.A : Boyama için talep edilen miktarı ayrılan miktar ile karşılaştır. Çıkılabilecek kadar stok var mı kontrol et 
                bool IsBoyama = DtBoyama.Length > 0;

                //Boyanacak düğmeler için ayrı satır oluşturuluyor
                if (IsBoyama)
                {
                    foreach (DataRow dr in dtAksesuar.Select("Isnull(BoyanacakMiktar,0) > 0 and TalepEdilen > Isnull(BoyanacakMiktar,0)"))
                    {
                        DataRow drNewRow = dtAksesuar.NewRow();
                        drNewRow["AksesuarId"] = dr["AksesuarId"];
                        drNewRow["Boyama"] = false;
                        drNewRow["TalepEdilen"] = dr["TalepEdilen"].ToInt() - dr["BoyanacakMiktar"].ToInt();
                        dtAksesuar.Rows.Add(drNewRow);

                        dr["TalepEdilen"] = dr["BoyanacakMiktar"];
                    }
                }

                string xml = dtAksesuar.Serialize();
                int CariId = dsIhtiyac.Tables["Table1"].Rows[0]["CariId"].ToInt();

                aksesuarCikisTalebiId = ExecuteScalar("InsAksesuarCikisTalebi", xml, 10, OrderRef, BrandId, SezonId, 4, CariId,
                                                DBNull.Value, WhoAmI, DosyaNo, IsBoyama, DosyaIdx, gleBoyama.EditValue, 0).ToStr();
                distinctDosya.Select("Isnull(DosyaNo,'') = '" + DosyaNo + "'")[0]["AksesuarCikisTalebiId"] = aksesuarCikisTalebiId;

            }
            this.DialogResult = System.Windows.Forms.DialogResult.OK;
        }

        void bbiAksPO_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            DataTable dtAksesuar = gvTreeLines.DataTable();
            DataRow[] drIdle = dtAksesuar.Select("Isnull(IdleMiktar,0) > 0 and Isnull(EksikMiktar,0) > 0 and Isnull(OrtakMi,0) = 0");

            if (drIdle.Length > 0)
            {
                if (XtraMessageBox.Show("Bu siparişe ayırabileceğiniz IDLE stok var. İlk önce IDLE stoğu siparişe ayırmak ister misiniz ?", "Critical", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                    bbiRezerve.PerformClick();
            }

            DataRow[] dr = dtAksesuar.Select("Isnull(EksikMiktar,0) > 0");

            if (dr.Length > 0)
            {
                DataTable dt = dr.CopyToDataTable();

                dt.Columns.Remove("TalepEdilen");
                dt.Columns.Add("TalepEdilen", typeof(int), "EksikMiktar");

                using (Talep ast = new Talep(dt, BrandId, SezonId, OrderRef))
                    if (ast.ShowDialog() == DialogResult.OK)
                    {
                        string AksPOId = ast.POIds.ToString();
                        Rapor.Aksesuar.xrAksesuarSiparisFoy asf = new Rapor.Aksesuar.xrAksesuarSiparisFoy(AksPOId, "GetAksesuarSiparisFoyu", "AksPOId");
                        asf.ShowPreview();
                        Yenile();
                    }
            }
        }

        private void Yenile()
        {
            gvTreeLines.RefreshDataSource(true, SpName, Idxs, BrandId);
            SetButtonsEnabled();
        }

        private void SetButtonsEnabled()
        {
            DataTable dtAksesuar = gvTreeLines.DataTable();

            int RzvRowCount = dtAksesuar.Select("Isnull(IdleMiktar,0) > 0 and Isnull(EksikMiktar,0) > 0 and Isnull(OrtakMi,0) = 0").Length;
            int EksikRowCount = dtAksesuar.Select("Isnull(EksikMiktar,0) > 0").Length;
            bool IsEnoughQty = dtAksesuar.Select("Isnull(EksikMiktar,0) > 2 or Isnull(EksikMiktar,0) = TalepEdilen").Length == 0;

            bbiAksPO.Enabled = EksikRowCount > 0 && IsRequestable;
            bbiRezerve.Enabled = RzvRowCount > 0 && IsRequestable;

            bbiTalepOlustur.Enabled = IsRequestable && IsEnoughQty;
        }

        void gvTreeLines_RowCellStyle(object sender, RowCellStyleEventArgs e)
        {
            GridView view = sender as GridView;
            if (e.RowHandle > -1)
            {
                int TalepEdilen = view.GetRowCellValue(e.RowHandle, "TalepEdilen").ToInt();
                int EksikMiktar = view.GetRowCellValue(e.RowHandle, "EksikMiktar").ToInt();

                if (e.Column.FieldName == "TalepEdilen")
                {
                    int AyrilanMiktar = view.GetRowCellValue(e.RowHandle, "AyrilanMiktar").ToInt();
                    int IdleMiktar = view.GetRowCellValue(e.RowHandle, "IdleMiktar").ToInt();

                    int BrandId = view.GetRowCellValue(e.RowHandle, "BrandId").ToInt();

                    if ((AyrilanMiktar < TalepEdilen && BrandId != 1) || (IdleMiktar < TalepEdilen && BrandId == 1))
                        e.Appearance.BackColor = Color.Pink;
                    e.Appearance.Font = new Font(DevExpress.Utils.AppearanceObject.DefaultFont, FontStyle.Bold);
                }

                if (e.Column.FieldName == "EksikMiktar")
                {
                    e.Appearance.Font = new Font(DevExpress.Utils.AppearanceObject.DefaultFont, FontStyle.Bold);
                    e.Appearance.ForeColor = EksikMiktar > 2 || TalepEdilen == EksikMiktar ? Color.Red : Color.Green;
                }
            }
        }
    }
}